#if !defined(__INTERFACE_H)
#define __INTERFACE_H

#include "commun/sous_systeme.h"
#include "commun/utilise_sdl.h"
#if defined(__MACOSX__)
#include "SDL_ttf.h"
#include "SDL_image.h"
#else
#include "SDL/SDL_ttf.h"
#include "SDL/SDL_image.h"
#endif
#include <vector>
#include <string>

extern const char creation_ecran[];
extern const char chargement_police[];

class surface_affichable;
class observateur_evenement;


struct video {
	static void initialiser();
	static void fermer();
};

class module_interface : public sous_systeme<video> {
	SDL_Surface *ecran_;
	std::vector<surface_affichable*> a_afficher_;
	std::vector<observateur_evenement*> a_notifier_;
	bool doit_rafraichir_, doit_quitter_;
	TTF_Font *police_normale_;
	TTF_Font *police_grosse_;
	
	void afficher_image(surface_affichable*);
	void notifier_touche_clavier(int tu, int ts, bool r);
	void notifier_souris(int x, int y, bool r);
public:
	enum {	touche_retour_arriere = SDLK_BACKSPACE,
			touche_entree = SDLK_RETURN,
			touche_shift_gauche = SDLK_LSHIFT
	};
	
	static module_interface &instance() {
		return static_cast<module_interface&>(sous_systeme<video>::instance());
	}
	
	module_interface() throw(erreur);
	~module_interface() throw();
	
	SDL_Surface *generer_texte(std::string, bool gros);
	
	void rafraichir();
	void actualiser_affichage();
	void traiter_evenements();
	
	void demander_rafraichir() { doit_rafraichir_ = true; }
	void demander_quitter() { doit_quitter_ = true; }
	
	bool doit_quitter() { return doit_quitter_; }
	
	void inscrire(surface_affichable&);
	void desinscrire(surface_affichable&);
	void changement_ordre();
	
	void inscrire(observateur_evenement&);
	void desinscrire(observateur_evenement&);
};

#endif
